package com.dojotec.biblioteca.jsf.dao;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import com.dojotec.biblioteca.jsf.domain.Livro;
import com.dojotec.biblioteca.jsf.domain.LivroRepository;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Alan Almeida
 */

public class LivroDAO implements LivroRepository {
    
    @Override
    public Livro salvar(Livro livro) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(livro);
            em.getTransaction().commit();
            return livro;
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao salvar o livro. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public void atualizar(Livro livro) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.merge(livro);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao atualizar o livro. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public void excluir(Livro livro) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.remove(em.merge(livro));
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao excluir o livro. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public Livro buscarPorId(Long id) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createNamedQuery("Livro.buscarPorId").setParameter("id", id);
            em.getTransaction().commit();
            return (Livro)q.getSingleResult();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao buscar o livro. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public List<Livro> buscarTodos() {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createNamedQuery("Livro.buscarTodos");
            em.getTransaction().commit();
            return q.getResultList();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao buscar todos os livro. "+e.getMessage());
        } finally {
            em.close();
        }
    }
}
